package besteAukera;

import java.awt.Color;
import java.awt.Graphics;
import java.util.Vector;

public class Kablea extends AteLogikoak {
/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
/**
 * 
 */
	private Color kolorea;
	private Vector<Hanka> hankaBektorea = new Vector<Hanka>();
	private Vector<Hanka> sarreraBektorea = new Vector<Hanka>();
	private Hanka s1, i1;
	private boolean aldatua;
	private int xZBuk = x + 20, yZBuk = y, xZHas = x + 20, yZHas = y;
	private int xBBuk = x, yBBuk = y + 20, xBHas = x, yBHas = y + 20;
private String logika;
/**
 * Behar dituen parametroak pasata kable horizontala edo bertikala
 * sortzeko eraikitzailea. Hanka guztiak sortu eta gero hanken listan
 * sartzen ditu.
 * @param x1
 * 			:Kable horizontalaren irudiko ezker iskineko x koordenatua.
 * 			Bertikalaren kasuan goi iskineko x koordenatua.
 * @param y1
 * 			:Kable horizontalaren irudiko ezker iskineko y koordenatua.
 * 			Bertikalaren kasuan goi iskineko y koordenatua.
 * @param hankaKop
 * 			:Kablearen hanka kopurua.
 * @param sarKop
 * 			:Kablearen sarrera hanka kopurua.
 * @param motaFis
 * 			:Kablea bertikala edo horizontala den adierazteko.
 * @param kolorea
 */
	public Kablea(int x1, int y1, int hankaKop, int sarKop, String motaFis, Color kolorea,String log) {
		super(x1, y1, hankaKop, sarKop,motaFis, kolorea);
		
		// TODO Auto-generated constructor stub
		logika=log;
		if (motaFis.compareTo("horizontala") == 0) {
			s1 = new Hanka(x, y, log, "s", 0, this, "h", "ez",false);
			i1 = new Hanka(xZBuk + 20, yZBuk, log, "i", 1, this, "h",
					"ez",false);
		} else if (motaFis.compareTo("bertikala") == 0) {
			s1 = new Hanka(x, y, log, "s", 0, this, "b", "ez",false);
			i1 = new Hanka(xBBuk, yBBuk + 20, log, "i", 1, this, "b",
					"ez",false);
		}

aldatua=false;
		lotList[0] = s1;
		lotList[1] = i1;
	}
	/**
	 * Kablea marrazten du.
	 */
	public void marraztu(Graphics g) {
		if (getAukeratua() == true) {
			kolorea = Color.GRAY;
		} else {
			kolorea = Color.black;
		}
		g.setColor(kolorea);
		if (motaFisikoa.compareTo("horizontala") == 0)
			g.drawLine(xZHas, yZHas, xZBuk, yZBuk);
		if (motaFisikoa.compareTo("bertikala") == 0)
			g.drawLine(xBHas, yBHas, xBBuk, yBBuk);
		s1.marraztu(g);
		i1.marraztu(g);
	}
	public boolean isAldatua(){
		return aldatua;
	}
	public void setAldatua(boolean ald){
		
					aldatua=ald;
	}
/**
	 * Sagua kablearen irudiaren barnean dagoen edo ez adierazten du.  Saguaren 
	 * koordenatuak kablearenakin alderatuz. Kablearen posizioaren arabera azalera
	 * bat edo beste hartuko du barruko alde bezela.
	 * 
	 * @param x
	 * 			:Saguaren posizioa x ardatzean.
	 * @param y
	 * 			:Saguaren posizioa y ardatzean.
	 * @return true sagua kablearen barruan badago
	 * 		   false bestela
	 */

	public boolean barruanDago(int x, int y) {
		if (motaFisikoa.compareTo("horizontala") == 0) {
			if ((yZBuk > yZHas) && (xZBuk > xZHas))
				if ((x > xZHas) && (x < xZBuk) && (y > yZHas) && (y < (yZBuk))) {
					return true;
				}
			if ((yZBuk < yZHas) && (xZBuk > xZHas))
				if ((x > xZHas) && (x < xZBuk) && (y > yZBuk) && (y < (yZHas))) {
					return true;
				}
			if ((yZBuk > yZHas) && (xZBuk < xZHas))
				if ((x > xZBuk) && (x < xZHas) && (y > yZHas) && (y < yZBuk)) {
					return true;
				}
			if ((yZBuk < yZHas) && (xZBuk < xZHas))
				if ((x > xZBuk) && (x < xZHas) && (y > yZBuk) && (y < (yZHas))) {
					return true;
				}
		}
		// bertikala posizioz mugitzeko
		if (motaFisikoa.compareTo("bertikala") == 0) {
			if ((yBBuk > yBHas) && (xBBuk > xBHas))
				if ((x > xBHas) && (x < xBBuk) && (y > yBHas) && (y < (yBBuk))) {
					return true;
				}
			if ((yBBuk < yBHas) && (xBBuk > xBHas))
				if ((x > xBHas) && (x < xBBuk) && (y > yBBuk) && (y < (yBHas))) {
					return true;
				}
			if ((yBBuk > yBHas) && (xBBuk < xBHas))
				if ((x > xBBuk) && (x < xBHas) && (y > yBHas) && (y < yBBuk)) {
					return true;
				}
			if ((yBBuk < yBHas) && (xBBuk < xBHas))
				if ((x < xBHas) && (x > xBBuk) && (y > yBBuk) && (y < (yBHas))) {
					return true;
				}
		}
		return false;
	}

	/**
	 * Kablearen irudiaren  goiko(bertikala) edo ezkerreko(horizontala)
	 *  erpina finkatzen ditu.
	 * 
	 * @param x:
	 *            X ardatzaren posizioa finkatzen du.
	 * @param y:
	 *            Y ardatzaren posizioa finkatzen du.
	 */
	public void setPosizioa(int x1, int y1) {
		int xDesp = x1 - x;
		int yDesp = y1 - y;
		x = x1;
		y = y1;
		if (motaFisikoa.compareTo("bertikala") == 0) {
			xBHas = xBHas + xDesp;
			yBHas = yBHas + yDesp;
			xBBuk = xBBuk + xDesp;
			yBBuk = yBBuk + yDesp;
		} else if (motaFisikoa.compareTo("horizontala") == 0) {
			xZHas = xZHas + xDesp;
			yZHas = yZHas + yDesp;
			xZBuk = xZBuk + xDesp;
			yZBuk = yZBuk + yDesp;
		}
	}
	@Override
	/**
	 *  Kablearen irteerako hankari sarrerako hankaren balio logikoa 
	 *  emango dio.
	 */
	public void funtzioLogikoa(Integer... values) {
		// TODO Auto-generated method stub
		
		lotList[1].getIrteera().setBalioa(lotList[0].getSarrera().getBalioa());
	}
	/**
	 * Kablearen hankak hankaBektorea Vector-en sartzen du.
	 * 
	 * @return Kablearen hanken bektorea
	 */
	@Override
	public Vector<Hanka> getHankak() {
		// TODO Auto-generated method stub
		hankaBektorea = new Vector<Hanka>();
		hankaBektorea.addElement(s1);
		hankaBektorea.addElement(i1);
		return hankaBektorea;
	}
	/**
	 * Kablearen sarrerako hankak hankaBektorea Vector-en 
	 * sartzen du.
	 * 
	 * @return Kablearen sarrera hanken bektorea
	 */
	@Override
	public Vector<Hanka> getSarreraHankak() {
		sarreraBektorea = new Vector<Hanka>();
		sarreraBektorea.addElement(s1);
		return sarreraBektorea;
	}

	public Hanka getIrteeraHanka() {
		return i1;
	}
/**
 * Kablearen itxura aldatzen du, hanka batetik tiratuz hau posizioz aldatu
 * eta kablea luzatuz.
 * @param irtX
 * @param irtY
 * @param XZ
 * @param YZ
 * @param h
 * @param h2
 */
	public void luzatuKablea(int irtX, int irtY, Hanka h) {
		// TODO Auto-generated method stub
		if (motaFisikoa.compareTo("bertikala") == 0) {
			if (h.getHankaMota().compareTo("i")==0) {
				h.setPosizioa(irtX, irtY);
				xBBuk = irtX;
				yBBuk = irtY - 20;
			}
			if (h.getHankaMota().compareTo("s")==0) {
				h.setPosizioa(irtX, irtY);
				xBHas = irtX;
				yBHas = irtY + 20;
			}
		}
		if (motaFisikoa.compareTo("horizontala") == 0) {
			if (h.getHankaMota().compareTo("i")==0) {
				h.setPosizioa(irtX, irtY);
				xZBuk = irtX - 20;
				yZBuk = irtY;
			}
			if (h.getHankaMota().compareTo("s")==0) {
				h.setPosizioa(irtX, irtY);
				xZHas = irtX + 20;
				yZHas = irtY;
			}
		}
	}
	public String getLogika(){
		return logika;
	}
}
